Here we want to integrate in a single csv file all the relevant datas that we collected from our sources

Description of the variables

Cancer: Share of total population with any form of cancer, measured as the age-standardized percentage. This share has been age-standardized assuming a constant age structure to compare prevalence between countries and through time.

Air_pollution: Population-weighted average level of exposure to concentrations of suspended particles measuring less than 2.5 microns in diameter (PM2.5). Exposure is measured in micrograms of PM2.5 per cubic metre (µg/m³).

Alcool: Average per capita consumption of alcoholic beverages, measured in kilograms per year. Data is based on per capita food supply at the consumer level, but does not account for food waste at the consumer level

GDP per capta: Measured in constant international-$

Obesity: Obesity is defined as having a body-mass index (BMI) equal to or greater than 30. BMI is a person’s weight in kilograms divided by his or her height in metres squared

Old age Dependency: This is the ratio of the number of people older than 64 relative to the number of people in the working-age (15-64 years). Data are shown as the proportion of dependents per 100 working-age population.

Smoking: Share of population who smoke every day

Cleaning

We start by loading the library and the .csv files needed:

library(readr) #Used to read the csv
library(tidyverse) #Contains a lot of useful packages to clean the datas
library(gganimate) #To create animated plots
library(ggthemes) #To select some nice themes 
library(zoo) #To fill the N.A. values 
library(grid) #To display plots into a grid
library(gridExtra) #To display plots into a grid

Cancer <- read_csv("Datasets/Cancer.csv")
Air_pollution <- read_csv("Datasets/Air pollution.csv")
Alcool <- read_csv("Datasets/Alcool.csv")
GDP_per_capta <- read_csv("Datasets/GDP per capta.csv")
Obesity <- read_csv("Datasets/Obesity.csv")
Old_age_dependency_ratio <- read_csv("Datasets/Old age dependency ratio.csv")
Smoking <- read_csv("Datasets/Smoking.csv")
Population <- read_csv("Datasets/population-since-1800.csv")
countryContinent <- read_csv("Datasets/countryContinent.csv")

We proceed by taking the explanatory variable data set (Cancer) and adding the covariates as columns other columns, to do that we use the use the libraby “dplyr” as it makes it very easy to do and readable

Continent = countryContinent %>% select(country, continent)
Continentt = rename(Continent, Entity = country)
Cancer1 = left_join(Cancer, Air_pollution, by = c("Entity", "Code", "Year"))
Cancer2 = left_join(Cancer1, Alcool, by = c("Entity", "Code", "Year"))
Cancer3 = left_join(Cancer2, GDP_per_capta, by = c("Entity", "Code", "Year"))
Cancer4 = left_join(Cancer3, Obesity, by = c("Entity", "Code", "Year"))
Cancer5 = left_join(Cancer4, Old_age_dependency_ratio, by = c("Entity", "Code", "Year"))
Cancer6 = left_join(Cancer5, Smoking, by = c("Entity", "Code", "Year"))
Cancer7 = left_join(Cancer6, Continentt, by = "Entity")
Cancer_final = Cancer7

rm("Cancer1", "Cancer2", "Cancer3", "Cancer4", "Cancer5", "Cancer6", "Cancer7")
rm("Air_pollution", "Alcool", "Cancer", "GDP_per_capta", "Obesity", "Old_age_dependency_ratio", "Smoking", "Continent", "Continentt")

We now proceed by renaming the columns. This will make all the manipulations of the dataframe more readable:

colnames(Cancer_final)[4] <- "Cancer"
colnames(Cancer_final)[5] <- "AirPoll"
colnames(Cancer_final)[6] <- "Alcool"
colnames(Cancer_final)[7] <- "GDP"
colnames(Cancer_final)[8] <- "Obesity"
colnames(Cancer_final)[9] <- "Age"
colnames(Cancer_final)[10] <- "Smoking"

Here is what the final dataset looks like:

Data visualization (animated)

We will now take each of the covariate and plot it against the explanatory variable. We will use an animation to also show hot datapoints are changing through time and this will give a more complete (and for sure more pleasant) overview of the datas involved. Here we do some additional cleaning and corrections

Cancergraph = left_join(Cancer_final, Population, by = c("Entity", "Code", "Year"))
Cancergraph$Smoking = na.locf(Cancergraph$Smoking)
Cancergraph$AirPoll = na.locf(Cancergraph$AirPoll)
Cancergraph$Alcool = na.locf(Cancergraph$Alcool)
Cancergraph$GDP = na.locf(Cancergraph$GDP, fromLast = TRUE)
Cancergraph$Age = na.locf(Cancergraph$Age)
Cancergraph$Obesity = na.locf(Cancergraph$Obesity)
Cancergraph$`Population (historical estimates)` = na.locf(Cancergraph$`Population (historical estimates)`)

Here we plot the different animations:

graphPoll = Cancergraph %>%
  ggplot(aes(x = AirPoll, y = Cancer, color = continent, size = `Population (historical estimates)`)) +
  geom_point(alpha = 0.9, stroke = 0) +
  scale_size(range = c(2,12), guide = "none") +
  scale_color_brewer(palette = "Set2") +
  labs(title = "Cancer incidence vs Air Pollution", 
       x = "Air pollution exposure ", 
       y = "Share of people with Cancer",
       color = "Continent",
       caption = "Source: Our World in Data") +
  transition_time(Year) +
  labs (subtitle = "Year:{round(frame_time)}") 
 shadow_wake(wake_length = 0.05)
animate(graphPoll, height = 500, width = 800, fps = 30, duration = 15, end_pause = 60, res = 100)
anim_save("Airpoll Visual Animation.gif")


graphAlco = Cancergraph %>%
  ggplot(aes(x = Alcool, y = Cancer, color = continent, size = `Population (historical estimates)`)) +
  geom_point(alpha = 0.9, stroke = 0) +
  scale_size(range = c(2,12), guide = "none") +
  scale_color_brewer(palette = "Set2") +
  labs(title = "Cancer incidence vs Alcool consumption", 
       x = "Alcool consumed", 
       y = "Share of people with Cancer",
       color = "Continent",
       caption = "Source: Our World in Data") +
  transition_time(Year) +
  labs (subtitle = "Year:{round(frame_time)}") 
 shadow_wake(wake_length = 0.05)
animate(graphAlco, height = 500, width = 800, fps = 30, duration = 15, end_pause = 60, res = 100)
anim_save("Alcool Visual Animation.gif")


graphGDP = Cancergraph %>%
  ggplot(aes(x = GDP, y = Cancer, color = continent, size = `Population (historical estimates)`)) +
  geom_point(alpha = 0.9, stroke = 0) +
  scale_size(range = c(2,12), guide = "none") +
  scale_color_brewer(palette = "Set2") +
  labs(title = "Cancer incidence vs GDP", 
       x = "GDP per capta", 
       y = "Share of people with Cancer",
       color = "Continent",
       caption = "Source: Our World in Data") +
  transition_time(Year) +
  labs (subtitle = "Year:{round(frame_time)}") 
 shadow_wake(wake_length = 0.05)
animate(graphGDP, height = 500, width = 800, fps = 30, duration = 15, end_pause = 60, res = 100)
anim_save("GDP Visual Animation.gif")


graphObes = Cancergraph %>%
  ggplot(aes(x = Obesity, y = Cancer, color = continent, size = `Population (historical estimates)`)) +
  geom_point(alpha = 0.9, stroke = 0) +
  scale_size(range = c(2,12), guide = "none") +
  scale_color_brewer(palette = "Set2") +
  labs(title = "Cancer incidence vs Obesity", 
       x = "Share of Obese people", 
       y = "Share of people with Cancer",
       color = "Continent",
       caption = "Source: Our World in Data") +
  transition_time(Year) +
  labs (subtitle = "Year:{round(frame_time)}") 
 shadow_wake(wake_length = 0.05)
animate(graphObes, height = 500, width = 800, fps = 30, duration = 15, end_pause = 60, res = 100)
anim_save("Obesity Visual Animation.gif")


graphAge = Cancergraph %>%
  ggplot(aes(x = Age, y = Cancer, color = continent, size = `Population (historical estimates)`)) +
  geom_point(alpha = 0.9, stroke = 0) +
  scale_size(range = c(2,12), guide = "none") +
  scale_color_brewer(palette = "Set2") +
  labs(title = "Cancer incidence vs Age", 
       x = "Old people ratio", 
       y = "Share of people with Cancer",
       color = "Continent",
       caption = "Source: Our World in Data") +
  transition_time(Year) +
  labs (subtitle = "Year:{round(frame_time)}") 
 shadow_wake(wake_length = 0.05)
animate(graphAge, height = 500, width = 800, fps = 30, duration = 15, end_pause = 60, res = 100)
anim_save("Age Visual Animation.gif")


graphSmoke = Cancergraph %>%
  ggplot(aes(x = GDP, y = Cancer, color = continent, size = `Population (historical estimates)`)) +
  geom_point(alpha = 0.9, stroke = 0) +
  scale_size(range = c(2,12), guide = "none") +
  scale_color_brewer(palette = "Set2") +
  labs(title = "Cancer incidence vs Smoking", 
       x = "Number of Smokers", 
       y = "Share of people with Cancer",
       color = "Continent",
       caption = "Source: Our World in Data") +
  transition_time(Year) +
  labs (subtitle = "Year:{round(frame_time)}") 
 shadow_wake(wake_length = 0.05)
animate(graphSmoke, height = 500, width = 800, fps = 30, duration = 15, end_pause = 60, res = 100)
anim_save("Smoking Visual Animation.gif")

And eventually here it is the animations:

LS0tCnRpdGxlOiAiRGF0YSBjbGVhbmluZyIKYXV0aG9yOiAiTG9yZW56byBUYXJyaWNvbmUiCmRhdGU6ICIyMy8xMi8yMDIxIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogcGFwZXIKICAgIHRvYzogdHJ1ZQogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCi0tLQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFKQpgYGAKCiMgSGVyZSB3ZSB3YW50IHRvIGludGVncmF0ZSBpbiBhIHNpbmdsZSBjc3YgZmlsZSBhbGwgdGhlIHJlbGV2YW50IGRhdGFzIHRoYXQgd2UgY29sbGVjdGVkIGZyb20gb3VyIHNvdXJjZXMgCgojIyBTb3VjZXMgdXNlZApUaGUgc291cmNlcyB1c2VkIGZvciB0aGUgZGF0YXMgYXJlOgoKLSBDYW5jZXIgLT4gW0dsb2JhbCBCdXJkZW4gb2YgRGlzZWFzZSBDb2xsYWJvcmF0aXZlIE5ldHdvcmsuIEdsb2JhbCBCdXJkZW4gb2YgRGlzZWFzZSBTdHVkeSAyMDE3IChHQkQgMjAxNykgUmVzdWx0cy4gU2VhdHRsZSwgVW5pdGVkIFN0YXRlczogSW5zdGl0dXRlIGZvciBIZWFsdGggTWV0cmljcyBhbmQgRXZhbHVhdGlvbiAoSUhNRSksIDIwMThdKGh0dHA6Ly9naGR4LmhlYWx0aGRhdGEub3JnL2diZC1yZXN1bHRzLXRvb2wpCi0gQWlyX3BvbGx1dGlvbiAtPiBbV29ybGQgRGV2ZWxvcG1lbnQgSW5kaWNhdG9ycyAtIFdvcmxkIEJhbmsgXShodHRwOi8vZGF0YS53b3JsZGJhbmsub3JnL2RhdGEtY2F0YWxvZy93b3JsZC1kZXZlbG9wbWVudC1pbmRpY2F0b3JzKQotIEFsY29vbCAtPiBbRm9vZCBhbmQgQWdyaWN1bHR1cmUgT3JnYW5pemF0aW9uIG9mIHRoZSBVbml0ZWQgTmF0aW9ucyAoRkFPKSAoMjAxNyldKGh0dHA6Ly93d3cuZmFvLm9yZy9mYW9zdGF0L2VuLz8jZGF0YS8pCi0gR0RQX3Blcl9jYXB0YSAtPiBbV29ybGQgRGV2ZWxvcG1lbnQgSW5kaWNhdG9ycyAtIFdvcmxkIEJhbmsgXShodHRwOi8vZGF0YS53b3JsZGJhbmsub3JnL2RhdGEtY2F0YWxvZy93b3JsZC1kZXZlbG9wbWVudC1pbmRpY2F0b3JzKQotIE9iZXNpdHkgLT4gW1dvcmxkIEhlYWx0aCBPcmdhbml6YXRpb24gKFdITyldKGh0dHA6Ly9hcHBzLndoby5pbnQvZ2hvL2RhdGEvdmlldy5tYWluLlJFR0lPTjI0ODBBP2xhbmc9ZW4pCi0gT2xkX2FnZV9kZXBlbmRlbmN5IC0+IFtXb3JsZCBEZXZlbG9wbWVudCBJbmRpY2F0b3JzIC0gV29ybGQgQmFua10oaHR0cDovL2RhdGEud29ybGRiYW5rLm9yZy9kYXRhLWNhdGFsb2cvd29ybGQtZGV2ZWxvcG1lbnQtaW5kaWNhdG9ycykKLSBTbW9raW5nIC0+IFtOYXRpb25hbGx5IHJlcHJlc2VudGF0aXZlIHNvdXJjZXMsIHN1cnZleSBkYXRhXShodHRwOi8vZ2hkeC5oZWFsdGhkYXRhLm9yZy9yZWNvcmQvZ2xvYmFsLXNtb2tpbmctcHJldmFsZW5jZS1hbmQtY2lnYXJldHRlLWNvbnN1bXB0aW9uLTE5ODAtMjAxMikKCiMjIERlc2NyaXB0aW9uIG9mIHRoZSB2YXJpYWJsZXMKCioqQ2FuY2VyKio6IFNoYXJlIG9mIHRvdGFsIHBvcHVsYXRpb24gd2l0aCBhbnkgZm9ybSBvZiBjYW5jZXIsIG1lYXN1cmVkIGFzIHRoZSBhZ2Utc3RhbmRhcmRpemVkIHBlcmNlbnRhZ2UuIFRoaXMKc2hhcmUgaGFzIGJlZW4gYWdlLXN0YW5kYXJkaXplZCBhc3N1bWluZyBhIGNvbnN0YW50IGFnZSBzdHJ1Y3R1cmUgdG8gY29tcGFyZSBwcmV2YWxlbmNlIGJldHdlZW4KY291bnRyaWVzIGFuZCB0aHJvdWdoIHRpbWUuCgoqKkFpcl9wb2xsdXRpb24qKjogUG9wdWxhdGlvbi13ZWlnaHRlZCBhdmVyYWdlIGxldmVsIG9mIGV4cG9zdXJlIHRvIGNvbmNlbnRyYXRpb25zIG9mIHN1c3BlbmRlZApwYXJ0aWNsZXMgbWVhc3VyaW5nIGxlc3MgdGhhbiAyLjUgbWljcm9ucyBpbiBkaWFtZXRlciAoUE0yLjUpLgpFeHBvc3VyZSBpcyBtZWFzdXJlZCBpbiBtaWNyb2dyYW1zIG9mIFBNMi41IHBlciBjdWJpYyBtZXRyZSAowrVnL23CsykuCgoqKkFsY29vbCoqOiBBdmVyYWdlIHBlciBjYXBpdGEgY29uc3VtcHRpb24gb2YgYWxjb2hvbGljIGJldmVyYWdlcywgbWVhc3VyZWQgaW4ga2lsb2dyYW1zIHBlcgp5ZWFyLiBEYXRhIGlzIGJhc2VkIG9uIHBlciBjYXBpdGEgZm9vZCBzdXBwbHkgYXQgdGhlIGNvbnN1bWVyIGxldmVsLCBidXQgZG9lcyBub3QKYWNjb3VudCBmb3IgZm9vZCB3YXN0ZSBhdCB0aGUgY29uc3VtZXIgbGV2ZWwKCioqR0RQIHBlciBjYXB0YSoqOiBNZWFzdXJlZCBpbiBjb25zdGFudCBpbnRlcm5hdGlvbmFsLSQKCioqT2Jlc2l0eSoqOiBPYmVzaXR5IGlzIGRlZmluZWQgYXMgaGF2aW5nIGEgYm9keS1tYXNzIGluZGV4IChCTUkpIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiAzMC4gQk1JIGlzIGEgcGVyc29uJ3MKd2VpZ2h0IGluIGtpbG9ncmFtcyBkaXZpZGVkIGJ5IGhpcyBvciBoZXIgaGVpZ2h0IGluIG1ldHJlcyBzcXVhcmVkCgoqKk9sZCBhZ2UgRGVwZW5kZW5jeSoqOiBUaGlzIGlzIHRoZSByYXRpbyBvZiB0aGUgbnVtYmVyIG9mIHBlb3BsZSBvbGRlciB0aGFuIDY0IHJlbGF0aXZlIHRvIHRoZQpudW1iZXIgb2YgcGVvcGxlIGluIHRoZSB3b3JraW5nLWFnZSAoMTUtNjQgeWVhcnMpLiBEYXRhIGFyZSBzaG93biBhcwp0aGUgcHJvcG9ydGlvbiBvZiBkZXBlbmRlbnRzIHBlciAxMDAgd29ya2luZy1hZ2UgcG9wdWxhdGlvbi4KCioqU21va2luZyoqOiBTaGFyZSBvZiBwb3B1bGF0aW9uIHdobyBzbW9rZSBldmVyeSBkYXkKCgojIyBDbGVhbmluZyAKV2Ugc3RhcnQgYnkgbG9hZGluZyB0aGUgbGlicmFyeSBhbmQgdGhlIC5jc3YgZmlsZXMgbmVlZGVkOgoKYGBge3J9CmxpYnJhcnkocmVhZHIpICNVc2VkIHRvIHJlYWQgdGhlIGNzdgpsaWJyYXJ5KHRpZHl2ZXJzZSkgI0NvbnRhaW5zIGEgbG90IG9mIHVzZWZ1bCBwYWNrYWdlcyB0byBjbGVhbiB0aGUgZGF0YXMKbGlicmFyeShnZ2FuaW1hdGUpICNUbyBjcmVhdGUgYW5pbWF0ZWQgcGxvdHMKbGlicmFyeShnZ3RoZW1lcykgI1RvIHNlbGVjdCBzb21lIG5pY2UgdGhlbWVzIApsaWJyYXJ5KHpvbykgI1RvIGZpbGwgdGhlIE4uQS4gdmFsdWVzIApsaWJyYXJ5KGdyaWQpICNUbyBkaXNwbGF5IHBsb3RzIGludG8gYSBncmlkCmxpYnJhcnkoZ3JpZEV4dHJhKSAjVG8gZGlzcGxheSBwbG90cyBpbnRvIGEgZ3JpZAoKQ2FuY2VyIDwtIHJlYWRfY3N2KCJEYXRhc2V0cy9DYW5jZXIuY3N2IikKQWlyX3BvbGx1dGlvbiA8LSByZWFkX2NzdigiRGF0YXNldHMvQWlyIHBvbGx1dGlvbi5jc3YiKQpBbGNvb2wgPC0gcmVhZF9jc3YoIkRhdGFzZXRzL0FsY29vbC5jc3YiKQpHRFBfcGVyX2NhcHRhIDwtIHJlYWRfY3N2KCJEYXRhc2V0cy9HRFAgcGVyIGNhcHRhLmNzdiIpCk9iZXNpdHkgPC0gcmVhZF9jc3YoIkRhdGFzZXRzL09iZXNpdHkuY3N2IikKT2xkX2FnZV9kZXBlbmRlbmN5X3JhdGlvIDwtIHJlYWRfY3N2KCJEYXRhc2V0cy9PbGQgYWdlIGRlcGVuZGVuY3kgcmF0aW8uY3N2IikKU21va2luZyA8LSByZWFkX2NzdigiRGF0YXNldHMvU21va2luZy5jc3YiKQpQb3B1bGF0aW9uIDwtIHJlYWRfY3N2KCJEYXRhc2V0cy9wb3B1bGF0aW9uLXNpbmNlLTE4MDAuY3N2IikKY291bnRyeUNvbnRpbmVudCA8LSByZWFkX2NzdigiRGF0YXNldHMvY291bnRyeUNvbnRpbmVudC5jc3YiKQpgYGAKIApXZSBwcm9jZWVkIGJ5IHRha2luZyB0aGUgZXhwbGFuYXRvcnkgdmFyaWFibGUgZGF0YSBzZXQgKENhbmNlcikgYW5kIGFkZGluZyB0aGUgY292YXJpYXRlcyBhcyBjb2x1bW5zIG90aGVyIGNvbHVtbnMsIHRvIGRvIHRoYXQgd2UgdXNlIHRoZSB1c2UgdGhlIGxpYnJhYnkgImRwbHlyIiBhcyBpdCBtYWtlcyBpdCB2ZXJ5IGVhc3kgdG8gZG8gYW5kIHJlYWRhYmxlCgpgYGB7cn0KQ29udGluZW50ID0gY291bnRyeUNvbnRpbmVudCAlPiUgc2VsZWN0KGNvdW50cnksIGNvbnRpbmVudCkKQ29udGluZW50dCA9IHJlbmFtZShDb250aW5lbnQsIEVudGl0eSA9IGNvdW50cnkpCkNhbmNlcjEgPSBsZWZ0X2pvaW4oQ2FuY2VyLCBBaXJfcG9sbHV0aW9uLCBieSA9IGMoIkVudGl0eSIsICJDb2RlIiwgIlllYXIiKSkKQ2FuY2VyMiA9IGxlZnRfam9pbihDYW5jZXIxLCBBbGNvb2wsIGJ5ID0gYygiRW50aXR5IiwgIkNvZGUiLCAiWWVhciIpKQpDYW5jZXIzID0gbGVmdF9qb2luKENhbmNlcjIsIEdEUF9wZXJfY2FwdGEsIGJ5ID0gYygiRW50aXR5IiwgIkNvZGUiLCAiWWVhciIpKQpDYW5jZXI0ID0gbGVmdF9qb2luKENhbmNlcjMsIE9iZXNpdHksIGJ5ID0gYygiRW50aXR5IiwgIkNvZGUiLCAiWWVhciIpKQpDYW5jZXI1ID0gbGVmdF9qb2luKENhbmNlcjQsIE9sZF9hZ2VfZGVwZW5kZW5jeV9yYXRpbywgYnkgPSBjKCJFbnRpdHkiLCAiQ29kZSIsICJZZWFyIikpCkNhbmNlcjYgPSBsZWZ0X2pvaW4oQ2FuY2VyNSwgU21va2luZywgYnkgPSBjKCJFbnRpdHkiLCAiQ29kZSIsICJZZWFyIikpCkNhbmNlcjcgPSBsZWZ0X2pvaW4oQ2FuY2VyNiwgQ29udGluZW50dCwgYnkgPSAiRW50aXR5IikKQ2FuY2VyX2ZpbmFsID0gQ2FuY2VyNwoKcm0oIkNhbmNlcjEiLCAiQ2FuY2VyMiIsICJDYW5jZXIzIiwgIkNhbmNlcjQiLCAiQ2FuY2VyNSIsICJDYW5jZXI2IiwgIkNhbmNlcjciKQpybSgiQWlyX3BvbGx1dGlvbiIsICJBbGNvb2wiLCAiQ2FuY2VyIiwgIkdEUF9wZXJfY2FwdGEiLCAiT2Jlc2l0eSIsICJPbGRfYWdlX2RlcGVuZGVuY3lfcmF0aW8iLCAiU21va2luZyIsICJDb250aW5lbnQiLCAiQ29udGluZW50dCIpCmBgYAoKV2Ugbm93IHByb2NlZWQgYnkgcmVuYW1pbmcgdGhlIGNvbHVtbnMuIFRoaXMgd2lsbCBtYWtlIGFsbCB0aGUgbWFuaXB1bGF0aW9ucyBvZiB0aGUgZGF0YWZyYW1lIG1vcmUgcmVhZGFibGU6CgpgYGB7cn0KY29sbmFtZXMoQ2FuY2VyX2ZpbmFsKVs0XSA8LSAiQ2FuY2VyIgpjb2xuYW1lcyhDYW5jZXJfZmluYWwpWzVdIDwtICJBaXJQb2xsIgpjb2xuYW1lcyhDYW5jZXJfZmluYWwpWzZdIDwtICJBbGNvb2wiCmNvbG5hbWVzKENhbmNlcl9maW5hbClbN10gPC0gIkdEUCIKY29sbmFtZXMoQ2FuY2VyX2ZpbmFsKVs4XSA8LSAiT2Jlc2l0eSIKY29sbmFtZXMoQ2FuY2VyX2ZpbmFsKVs5XSA8LSAiQWdlIgpjb2xuYW1lcyhDYW5jZXJfZmluYWwpWzEwXSA8LSAiU21va2luZyIKYGBgCgpIZXJlIGlzIHdoYXQgdGhlIGZpbmFsIGRhdGFzZXQgbG9va3MgbGlrZToKCmBgYHtyLCBlY2hvPSBGQUxTRX0KQ2FuY2VyX2ZpbmFsCndyaXRlLmNzdihDYW5jZXJfZmluYWwsICJDYW5jZXJfZmluYWwuY3N2Iiwgcm93Lm5hbWVzPUZBTFNFLCBxdW90ZT1GQUxTRSkgI3RvIHNhdmUgdGhlIGZpbGUgaW50byBvdXIgZW52aXJvbm1lbnQKYGBgCgojIERhdGEgdmlzdWFsaXphdGlvbiAoYW5pbWF0ZWQpCgpXZSB3aWxsIG5vdyB0YWtlIGVhY2ggb2YgdGhlIGNvdmFyaWF0ZSBhbmQgcGxvdCBpdCBhZ2FpbnN0IHRoZSBleHBsYW5hdG9yeSB2YXJpYWJsZS4gV2Ugd2lsbCB1c2UgYW4gYW5pbWF0aW9uIHRvIGFsc28gc2hvdyBob3QgZGF0YXBvaW50cyBhcmUgY2hhbmdpbmcgdGhyb3VnaCB0aW1lIGFuZCB0aGlzIHdpbGwgZ2l2ZSBhIG1vcmUgY29tcGxldGUgKGFuZCBmb3Igc3VyZSBtb3JlIHBsZWFzYW50KSBvdmVydmlldyBvZiB0aGUgZGF0YXMgaW52b2x2ZWQuIEhlcmUgd2UgZG8gc29tZSBhZGRpdGlvbmFsIGNsZWFuaW5nIGFuZCBjb3JyZWN0aW9ucyAKCmBgYHtyfQpDYW5jZXJncmFwaCA9IGxlZnRfam9pbihDYW5jZXJfZmluYWwsIFBvcHVsYXRpb24sIGJ5ID0gYygiRW50aXR5IiwgIkNvZGUiLCAiWWVhciIpKQpDYW5jZXJncmFwaCRTbW9raW5nID0gbmEubG9jZihDYW5jZXJncmFwaCRTbW9raW5nKQpDYW5jZXJncmFwaCRBaXJQb2xsID0gbmEubG9jZihDYW5jZXJncmFwaCRBaXJQb2xsKQpDYW5jZXJncmFwaCRBbGNvb2wgPSBuYS5sb2NmKENhbmNlcmdyYXBoJEFsY29vbCkKQ2FuY2VyZ3JhcGgkR0RQID0gbmEubG9jZihDYW5jZXJncmFwaCRHRFAsIGZyb21MYXN0ID0gVFJVRSkKQ2FuY2VyZ3JhcGgkQWdlID0gbmEubG9jZihDYW5jZXJncmFwaCRBZ2UpCkNhbmNlcmdyYXBoJE9iZXNpdHkgPSBuYS5sb2NmKENhbmNlcmdyYXBoJE9iZXNpdHkpCkNhbmNlcmdyYXBoJGBQb3B1bGF0aW9uIChoaXN0b3JpY2FsIGVzdGltYXRlcylgID0gbmEubG9jZihDYW5jZXJncmFwaCRgUG9wdWxhdGlvbiAoaGlzdG9yaWNhbCBlc3RpbWF0ZXMpYCkKCmBgYAoKCkhlcmUgd2UgcGxvdCB0aGUgZGlmZmVyZW50IGFuaW1hdGlvbnM6CgpgYGB7ciwgZXZhbD1GQUxTRX0KZ3JhcGhQb2xsID0gQ2FuY2VyZ3JhcGggJT4lCiAgZ2dwbG90KGFlcyh4ID0gQWlyUG9sbCwgeSA9IENhbmNlciwgY29sb3IgPSBjb250aW5lbnQsIHNpemUgPSBgUG9wdWxhdGlvbiAoaGlzdG9yaWNhbCBlc3RpbWF0ZXMpYCkpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC45LCBzdHJva2UgPSAwKSArCiAgc2NhbGVfc2l6ZShyYW5nZSA9IGMoMiwxMiksIGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpICsKICBsYWJzKHRpdGxlID0gIkNhbmNlciBpbmNpZGVuY2UgdnMgQWlyIFBvbGx1dGlvbiIsIAogICAgICAgeCA9ICJBaXIgcG9sbHV0aW9uIGV4cG9zdXJlICIsIAogICAgICAgeSA9ICJTaGFyZSBvZiBwZW9wbGUgd2l0aCBDYW5jZXIiLAogICAgICAgY29sb3IgPSAiQ29udGluZW50IiwKICAgICAgIGNhcHRpb24gPSAiU291cmNlOiBPdXIgV29ybGQgaW4gRGF0YSIpICsKICB0cmFuc2l0aW9uX3RpbWUoWWVhcikgKwogIGxhYnMgKHN1YnRpdGxlID0gIlllYXI6e3JvdW5kKGZyYW1lX3RpbWUpfSIpIAogc2hhZG93X3dha2Uod2FrZV9sZW5ndGggPSAwLjA1KQphbmltYXRlKGdyYXBoUG9sbCwgaGVpZ2h0ID0gNTAwLCB3aWR0aCA9IDgwMCwgZnBzID0gMzAsIGR1cmF0aW9uID0gMTUsIGVuZF9wYXVzZSA9IDYwLCByZXMgPSAxMDApCmFuaW1fc2F2ZSgiQWlycG9sbCBWaXN1YWwgQW5pbWF0aW9uLmdpZiIpCgoKZ3JhcGhBbGNvID0gQ2FuY2VyZ3JhcGggJT4lCiAgZ2dwbG90KGFlcyh4ID0gQWxjb29sLCB5ID0gQ2FuY2VyLCBjb2xvciA9IGNvbnRpbmVudCwgc2l6ZSA9IGBQb3B1bGF0aW9uIChoaXN0b3JpY2FsIGVzdGltYXRlcylgKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjksIHN0cm9rZSA9IDApICsKICBzY2FsZV9zaXplKHJhbmdlID0gYygyLDEyKSwgZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikgKwogIGxhYnModGl0bGUgPSAiQ2FuY2VyIGluY2lkZW5jZSB2cyBBbGNvb2wgY29uc3VtcHRpb24iLCAKICAgICAgIHggPSAiQWxjb29sIGNvbnN1bWVkIiwgCiAgICAgICB5ID0gIlNoYXJlIG9mIHBlb3BsZSB3aXRoIENhbmNlciIsCiAgICAgICBjb2xvciA9ICJDb250aW5lbnQiLAogICAgICAgY2FwdGlvbiA9ICJTb3VyY2U6IE91ciBXb3JsZCBpbiBEYXRhIikgKwogIHRyYW5zaXRpb25fdGltZShZZWFyKSArCiAgbGFicyAoc3VidGl0bGUgPSAiWWVhcjp7cm91bmQoZnJhbWVfdGltZSl9IikgCiBzaGFkb3dfd2FrZSh3YWtlX2xlbmd0aCA9IDAuMDUpCmFuaW1hdGUoZ3JhcGhBbGNvLCBoZWlnaHQgPSA1MDAsIHdpZHRoID0gODAwLCBmcHMgPSAzMCwgZHVyYXRpb24gPSAxNSwgZW5kX3BhdXNlID0gNjAsIHJlcyA9IDEwMCkKYW5pbV9zYXZlKCJBbGNvb2wgVmlzdWFsIEFuaW1hdGlvbi5naWYiKQoKCmdyYXBoR0RQID0gQ2FuY2VyZ3JhcGggJT4lCiAgZ2dwbG90KGFlcyh4ID0gR0RQLCB5ID0gQ2FuY2VyLCBjb2xvciA9IGNvbnRpbmVudCwgc2l6ZSA9IGBQb3B1bGF0aW9uIChoaXN0b3JpY2FsIGVzdGltYXRlcylgKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjksIHN0cm9rZSA9IDApICsKICBzY2FsZV9zaXplKHJhbmdlID0gYygyLDEyKSwgZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikgKwogIGxhYnModGl0bGUgPSAiQ2FuY2VyIGluY2lkZW5jZSB2cyBHRFAiLCAKICAgICAgIHggPSAiR0RQIHBlciBjYXB0YSIsIAogICAgICAgeSA9ICJTaGFyZSBvZiBwZW9wbGUgd2l0aCBDYW5jZXIiLAogICAgICAgY29sb3IgPSAiQ29udGluZW50IiwKICAgICAgIGNhcHRpb24gPSAiU291cmNlOiBPdXIgV29ybGQgaW4gRGF0YSIpICsKICB0cmFuc2l0aW9uX3RpbWUoWWVhcikgKwogIGxhYnMgKHN1YnRpdGxlID0gIlllYXI6e3JvdW5kKGZyYW1lX3RpbWUpfSIpIAogc2hhZG93X3dha2Uod2FrZV9sZW5ndGggPSAwLjA1KQphbmltYXRlKGdyYXBoR0RQLCBoZWlnaHQgPSA1MDAsIHdpZHRoID0gODAwLCBmcHMgPSAzMCwgZHVyYXRpb24gPSAxNSwgZW5kX3BhdXNlID0gNjAsIHJlcyA9IDEwMCkKYW5pbV9zYXZlKCJHRFAgVmlzdWFsIEFuaW1hdGlvbi5naWYiKQoKCmdyYXBoT2JlcyA9IENhbmNlcmdyYXBoICU+JQogIGdncGxvdChhZXMoeCA9IE9iZXNpdHksIHkgPSBDYW5jZXIsIGNvbG9yID0gY29udGluZW50LCBzaXplID0gYFBvcHVsYXRpb24gKGhpc3RvcmljYWwgZXN0aW1hdGVzKWApKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuOSwgc3Ryb2tlID0gMCkgKwogIHNjYWxlX3NpemUocmFuZ2UgPSBjKDIsMTIpLCBndWlkZSA9ICJub25lIikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlNldDIiKSArCiAgbGFicyh0aXRsZSA9ICJDYW5jZXIgaW5jaWRlbmNlIHZzIE9iZXNpdHkiLCAKICAgICAgIHggPSAiU2hhcmUgb2YgT2Jlc2UgcGVvcGxlIiwgCiAgICAgICB5ID0gIlNoYXJlIG9mIHBlb3BsZSB3aXRoIENhbmNlciIsCiAgICAgICBjb2xvciA9ICJDb250aW5lbnQiLAogICAgICAgY2FwdGlvbiA9ICJTb3VyY2U6IE91ciBXb3JsZCBpbiBEYXRhIikgKwogIHRyYW5zaXRpb25fdGltZShZZWFyKSArCiAgbGFicyAoc3VidGl0bGUgPSAiWWVhcjp7cm91bmQoZnJhbWVfdGltZSl9IikgCiBzaGFkb3dfd2FrZSh3YWtlX2xlbmd0aCA9IDAuMDUpCmFuaW1hdGUoZ3JhcGhPYmVzLCBoZWlnaHQgPSA1MDAsIHdpZHRoID0gODAwLCBmcHMgPSAzMCwgZHVyYXRpb24gPSAxNSwgZW5kX3BhdXNlID0gNjAsIHJlcyA9IDEwMCkKYW5pbV9zYXZlKCJPYmVzaXR5IFZpc3VhbCBBbmltYXRpb24uZ2lmIikKCgpncmFwaEFnZSA9IENhbmNlcmdyYXBoICU+JQogIGdncGxvdChhZXMoeCA9IEFnZSwgeSA9IENhbmNlciwgY29sb3IgPSBjb250aW5lbnQsIHNpemUgPSBgUG9wdWxhdGlvbiAoaGlzdG9yaWNhbCBlc3RpbWF0ZXMpYCkpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC45LCBzdHJva2UgPSAwKSArCiAgc2NhbGVfc2l6ZShyYW5nZSA9IGMoMiwxMiksIGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpICsKICBsYWJzKHRpdGxlID0gIkNhbmNlciBpbmNpZGVuY2UgdnMgQWdlIiwgCiAgICAgICB4ID0gIk9sZCBwZW9wbGUgcmF0aW8iLCAKICAgICAgIHkgPSAiU2hhcmUgb2YgcGVvcGxlIHdpdGggQ2FuY2VyIiwKICAgICAgIGNvbG9yID0gIkNvbnRpbmVudCIsCiAgICAgICBjYXB0aW9uID0gIlNvdXJjZTogT3VyIFdvcmxkIGluIERhdGEiKSArCiAgdHJhbnNpdGlvbl90aW1lKFllYXIpICsKICBsYWJzIChzdWJ0aXRsZSA9ICJZZWFyOntyb3VuZChmcmFtZV90aW1lKX0iKSAKIHNoYWRvd193YWtlKHdha2VfbGVuZ3RoID0gMC4wNSkKYW5pbWF0ZShncmFwaEFnZSwgaGVpZ2h0ID0gNTAwLCB3aWR0aCA9IDgwMCwgZnBzID0gMzAsIGR1cmF0aW9uID0gMTUsIGVuZF9wYXVzZSA9IDYwLCByZXMgPSAxMDApCmFuaW1fc2F2ZSgiQWdlIFZpc3VhbCBBbmltYXRpb24uZ2lmIikKCgpncmFwaFNtb2tlID0gQ2FuY2VyZ3JhcGggJT4lCiAgZ2dwbG90KGFlcyh4ID0gR0RQLCB5ID0gQ2FuY2VyLCBjb2xvciA9IGNvbnRpbmVudCwgc2l6ZSA9IGBQb3B1bGF0aW9uIChoaXN0b3JpY2FsIGVzdGltYXRlcylgKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjksIHN0cm9rZSA9IDApICsKICBzY2FsZV9zaXplKHJhbmdlID0gYygyLDEyKSwgZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikgKwogIGxhYnModGl0bGUgPSAiQ2FuY2VyIGluY2lkZW5jZSB2cyBTbW9raW5nIiwgCiAgICAgICB4ID0gIk51bWJlciBvZiBTbW9rZXJzIiwgCiAgICAgICB5ID0gIlNoYXJlIG9mIHBlb3BsZSB3aXRoIENhbmNlciIsCiAgICAgICBjb2xvciA9ICJDb250aW5lbnQiLAogICAgICAgY2FwdGlvbiA9ICJTb3VyY2U6IE91ciBXb3JsZCBpbiBEYXRhIikgKwogIHRyYW5zaXRpb25fdGltZShZZWFyKSArCiAgbGFicyAoc3VidGl0bGUgPSAiWWVhcjp7cm91bmQoZnJhbWVfdGltZSl9IikgCiBzaGFkb3dfd2FrZSh3YWtlX2xlbmd0aCA9IDAuMDUpCmFuaW1hdGUoZ3JhcGhTbW9rZSwgaGVpZ2h0ID0gNTAwLCB3aWR0aCA9IDgwMCwgZnBzID0gMzAsIGR1cmF0aW9uID0gMTUsIGVuZF9wYXVzZSA9IDYwLCByZXMgPSAxMDApCmFuaW1fc2F2ZSgiU21va2luZyBWaXN1YWwgQW5pbWF0aW9uLmdpZiIpCgoKYGBgCkFuZCBldmVudHVhbGx5IGhlcmUgaXQgaXMgdGhlIGFuaW1hdGlvbnM6CgpgYGB7ciwgZWNobz1GQUxTRX0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIkFpcnBvbGwgVmlzdWFsIEFuaW1hdGlvbi5naWYiKQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiQWxjb29sIFZpc3VhbCBBbmltYXRpb24uZ2lmIikKa25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIkdEUCBWaXN1YWwgQW5pbWF0aW9uLmdpZiIpCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJPYmVzaXR5IFZpc3VhbCBBbmltYXRpb24uZ2lmIikKa25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIkFnZSBWaXN1YWwgQW5pbWF0aW9uLmdpZiIpCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJTbW9raW5nIFZpc3VhbCBBbmltYXRpb24gMi5naWYiKQpgYGAKCg==